package bll

import (
	"context"
	"manager/errors"

	"manager/event"
	"manager/model"
	"manager/model/entity"
	"manager/store"
	"manager/store/postgres"
	"time"
)

type storeBindUser struct {
	iStoreBindUser store.IStoreBindUser
}

var StoreBindUser = &storeBindUser{
	iStoreBindUser: postgres.StoreBindUser,
}

func (a *storeBindUser) init() func() {
	return func() {}
}

func (a *storeBindUser) onEvent(*event.Data) {}

// Create 创建
func (a *storeBindUser) Create(ctx context.Context, in *model.StoreBindUserCreateRequest) error {
	var (
		err error
	)

	// 核查记录是否存在
	info, _ := postgres.StoreBindUser.Find(ctx, &model.StoreBindUserInfoRequest{
		StoreId: &in.StoreId,
		UserId:  &in.UserId,
	})

	if info.Id > 0 {
		return errors.ErrStoreBindUserExist.Error()
	}

	// 构建创建现场数据
	c := buildStoreBindUser(in)
	_, err = a.iStoreBindUser.Create(ctx, c)
	return err
}

// Update 更新
func (a *storeBindUser) Update(ctx context.Context, in *model.StoreBindUserUpdateRequest) error {
	var (
		dict = make(map[string]interface{})
	)

	if in.StoreId != nil {
		dict["store_id"] = in.StoreId
	}

	if in.UserId != nil {
		dict["user_id"] = in.UserId
	}

	if in.IsLeader != nil {
		dict["is_leader"] = in.IsLeader
	}

	dict["updated_at"] = time.Now().Unix()

	return a.iStoreBindUser.Update(ctx, in.Id, dict)
}

// Delete 删除
func (a *storeBindUser) Delete(ctx context.Context, in *model.StoreBindUserDeleteRequest) error {
	return a.iStoreBindUser.Delete(ctx, in.Id)
}

// List 列表查询
func (a *storeBindUser) List(ctx context.Context, in *model.StoreBindUserListRequest) (*model.StoreBindUserListResponse, error) {
	var (
		err   error
		total int
		list  []*entity.StoreBindUser
		out   = &model.StoreBindUserListResponse{}
	)

	if total, list, err = a.iStoreBindUser.List(ctx, in); err != nil {
		return nil, err
	}

	out.Total = total
	out.List = model.StoreBindUsersEntityToDto(list)

	return out, nil
}

// Find 列表查询
func (a *storeBindUser) Find(ctx context.Context, in *model.StoreBindUserInfoRequest) (*model.StoreBindUserInfo, error) {
	var (
		err  error
		data *entity.StoreBindUser
		out  = &model.StoreBindUserInfo{}
	)

	if data, err = a.iStoreBindUser.Find(ctx, in); err != nil {
		return nil, err
	}

	out = model.StoreBindUserEntityToDto(data)
	return out, nil
}

// buildStoreBindUser 构建创建数据现场
func buildStoreBindUser(in *model.StoreBindUserCreateRequest) *entity.StoreBindUser {
	// todo: check the entity is required
	return &entity.StoreBindUser{

		StoreId: in.StoreId,

		UserId: in.UserId,

		IsLeader: in.IsLeader,

		CreatedAt: time.Now().Unix(),

		UpdatedAt: time.Now().Unix(),
	}
}
